\documentclass[12pt, a4paper]{article}
\usepackage[margin = 1.5cm, includefoot]{geometry}
\usepackage{CJK}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{indentfirst} % this package ensures that all paragraphs
                          % will be indented
\usepackage{multirow}
\usepackage[htt]{hyphenat}

\setlength{\parindent}{2em} % 2em is the lenght of two chinese chars

\begin{CJK}{UTF8}{gbsn}
  \title{LaTeX 上安装 CJK 字体\\\small (openSUSE 11.0)}
  \author{陈如山\\chenrs@ics.neu.edu.cn}
  \date{2008年06月23日}
\end{CJK}

\begin{document}
\newlength{\crsParboxWid}
\setlength{\crsParboxWid}{145mm}
\begin{CJK}{UTF8}{gbsn}
\maketitle
\begin{CJK}{UTF8}{gbsn}
  {\Large 注意：我现在对这篇文章中所写的原理还不是特别懂，写的有些东西还只是我个人的猜测而已。以后明了了再进行修改}
\end{CJK}

\section{安装一个字体需要的几种文件}
\subsection{文件格式}
\begin{itemize}
\item .ttf
\item .sfd
\item .tfm
\item .enc
\item .fd
\item .map
\item .pfb
\end{itemize}
\subsection{各文件作用}
\begin{enumerate}
\item {\bfseries .ttf 文件}

  这个很常见了，就是字型文件

\item {\bfseries .sfd 文件}

  \vspace{3mm}
  \fbox{
    \parbox{165mm}{
      {\bfseries 以下文档摘自http://www.tug.org/mail-archives/twg-tds/2003-July/000834.html}
    }
  }
  \vspace{3mm}

  Usually .sfd files have been used with the ttf2tfm and ttf2pk packages which are contained in the FreeType 1 library as a contribution. The role of this file format is simple. It gives information how to divide huge characters into the set of 256 characters.

  CJKV (Chinese/Japanese/Korean/old Vietnamese) fonts usually contain several thousand gly-phs, to use them with TeX it is necessary to split such large fonts into subfonts. Subfont definition files (usually having the extension '.sfd') are a simple means to do this smoothly.

  A subfont file name usually consists of a prefix, a subfont infix, and a postfix (which is empty in most cases), e.g. 
  \begin{quote}
    \fbox{
      \parbox{\crsParboxWid}{
        ntukai23 $-$ $>$ prefix: ntukai, infix: 23, postfix: (empty)
      }
    }
  \end{quote}
  
  Here the syntax of a line in an SFD file, describing one subfont:
  
  \begin{quote}
    \fbox{
      \parbox{\crsParboxWid}{
        $<$whitespace$>$ $<$infix$>$ $<$whitespace$>$ $<$ranges$>$ $<$whitespace$>$
      }
    }
  \end{quote}
  
  A line can be continued on the next line with a backslash ending the line. The ranges must not overlap; offsets have to be in the range 0-255.
  
  Example:
  \begin{quote}
    \fbox{
      \parbox{\crsParboxWid}{
        The line

        \hspace*{8em} 03   10: 0x2349 0x2345\_0x2347

        assigns to the code positions 10,  11, 12, and  13 of  the subfonts having the
        infix `03' the character codes 0x2349,  0x2345, 0x2346, and 0x2347, respectively.
      }
    }
  \end{quote}
  The SFD files in the distribution are customized for the CJK package for LaTeX.

\item{\bfseries .tfm 文件}

  全称：tex font metric。描述的是每个字符的宽、高、深和斜体修正，以及两个字符之间的间距调整(kerning) 和连字 (ligature)。它并不包含字型信息。这个文件和字型文件是 tex 处理源文件的不同阶段调用的。

\item{\bfseries .enc 文件}

  就是编码文件。所谓的 encoding 就是一个字符在一组字符集中的序号。好比 a 在 ASCII 中编码为 97。

\item {\bfseries .fd 文件}

  how LaTeX font attributes are turned into TeX fonts is usually kept in a font definition (.fd) file（关于 .fd 文件的详细信息，在 Essential NFSS, by Sebastian Rahtz 和 Font selection in LaTeX, by Walter Schmidt 这两篇文章中有详细说明，它也教你怎么些 .fd 文件）

\item {\bfseries .map 文件}

  map raw tex font names to actual TrueType names

\item {\bfseries .pfb 文件}

  pfb 好像也是字型文件，跟ttf 好像是一个性质的东西
\end{enumerate}

\section{安装字体}
这里以安装 FZSongTi.ttf 为例，执行以下步骤：
\begin{enumerate}
\item {\bfseries 建立 \$HOME/texmf/ 目录。}
  
  字体将被安装在这个目录下，之所以不装在 /usr/share/texmf/ 下，是因为:
  \begin{itemize}
  \item 这个目录是 tex 的系统安装目录，直接在上面进行操作，如果出错的话，进行错误恢复是一件非常麻烦的事，而且易造成 tex 系统的错误；即便不出错，过一段时间你可能就分不清这个系统目录中哪些文件是你加入或修改的，哪些是系统自带的，这会给你进一步的 tex 系统配置带来麻烦。
  \item 如果你想避免将来重装系统时带来的重新配置 tex 的麻烦，尤其是如果你对 tex 进行了大幅修改的话，我劝你装在你的家目录下。  
  \end{itemize}

\item{\bfseries 建立 \$HOME/fonts/ 目录。}

  该目录将被作为存放字体相关配置文件的临时目录。这些配置文件最后会被拷到 \$HOME/t-exmf 目录的相应子目录下以完成字体的安装。

\item{\bfseries 将 FZSongTi.ttf，subfonts.pe 和 Unicode.sfd 拷到 \$HOME/fonts/ 中。}

  其中 subfonts.pe 是一个用于生成 .tmf 和 .pfb 文件的脚本（其实它还会生成 .afm 和 .enc 文件，只是这两种文件我们不用），Unicode.sfd 文件是用于决定 subfonts.pe 如何分割 FZSongTi.ttf。（subfonts.pe 我是从 texlive 2007 包中拷出来的，Unicode.sfd 是从 /usr/share/texmf/ttf2tfm 中拷来）

\item{\bfseries 执行 fontforge -script subfonts.pe FZSongTi.ttf FZSongTi-uni Unicode.sfd。}
  
  这个命令实际执行的是 subfonts.pe 脚本，fontforge 只是调用了这个脚本，subfonts.pe 后面的参数由 subfonts.pe 处理。
  \begin{quote}
    \fbox{
      \parbox{\crsParboxWid}{
        subfonts.pe 参数：
        \begin{itemize}
        \item \$1: The master font (e.g. 'FZSongTi.ttf')
        \item \$2: The name stem for the subfonts (e.g., `FZSongTi-uni')
        \item \$3: The subfont definition file (e.g., `Unicode.sfd')
        \end{itemize}
      }
    }
  \end{quote}

\item{\bfseries 创建脚本 MakeMap，在 \$HOME/fonts/ 目录下调用该脚本生成 .map 文件。}

  脚本内容如下：
  \begin{quote}
    \fbox{
      \parbox{\crsParboxWid}{
        for i in *.tfm\\
        do\\
        cat $>>$ FZSongTi-uni.map $<<$ EOF\\
        \$\{i\%.tfm\} \$\{i\%.tfm\} $<$ \$\{i\%.tfm\}.pfb\\
        EOF\\
        done
      }
    }
  \end{quote}
  
\item{\bfseries 建立目录 \$HOME/texmf/fonts/map/dvips/cjk/，将 MakeMap 生成的 .map 文件拷到这
    个目录下。}
  
  .map 文件好像必须保存在 \$HOME/texmf/fonts/map/ 这个子目录下。

\item{\bfseries 建立目录 \$HOME/texmf/fonts/tfm/cjk-latex/Unicode/FZSongTi-uni/，将 fontfor-ge 
    生成的 .tfm 文件拷到这个目录下。}
  
  .tfm 文件好像必须保存在 \$HOME/texmf/fonts/tfm/ 这个子目录下。

\item{\bfseries 建立目录 \$HOME/texmf/fonts/type1/FZSongTi/，将 fontforge 生成的 .pfb 文件拷到
    这个目录下。}
  
  .pfb 文件好像必须保存在 \$HOME/texmf/fonts/type1/ 这个子目录下。

\item{\bfseries 执行 texhash。}
  
  执行 texhash 是为了让 tex 知道你生成新加入的那些文件的存在。至于以超级用户身份执行还是只要普通用户身份执行还是二者都要，暂时不清。

\item{\bfseries 执行 updmap --enable Map FZSongTi-uni.map。}
  
  单纯的 FZSongTi-uni.map 有时行有时不行，不行的话，你得用 FZSongTi-uni.map 的全路径。在这里，即该命令为：
  \begin{quote}
    \fbox{
      \parbox{\crsParboxWid}{
        updmap --enable Map \$HOME/texmf/fonts/map/dvips/cjk/FZSongTi-uni.map
      }
    }
    
    {\small （当然这里 \$HOME 必须以你的家目录路径代替，好像必须用绝对路径）}
  \end{quote}
\end{enumerate}

\section{我对 latex 使用字体的一些理解}
\begin{enumerate}
  \item latex 用的 .map 文件好像有很多种，我用的是以下这种格式：
    \begin{quote}
      \fbox{
        \parbox{\crsParboxWid}{
          \vspace{3mm}
          ... ...\\
          FZSongTi-unie8 \hspace{1cm} FZSongTi-unie8 \hspace{1cm} $<$ FZSongTi-unie8.pfb\\
          ... ...
        }
      }
    \end{quote}
    用这种格式的 .map 文件，由于直接提供了 .pfb 字型文件，pdflatex 编译 .tex 文件时就不用自己生成字型了，如果用另一种格式的 .map 文件（我也不知道那种是哪种），pdflatex 就要调用 mktexpk 文件生成字型。
    
    \item pdflatex 生成字型分两步：
      \begin{enumerate}
        \item 先决定字怎么放。即字的大小，位置，与左右字的间距等等，你可以想象成这时候文件中只有一堆堆的小方框。
        \item 将字型放入小方框中。
      \end{enumerate}
      
    \item 我觉得 latex 生成字体过程如下：
      \begin{enumerate}
        \item 根据你给出的命令去相应的 .fd 文件中得出要用的 .tfm 文件。\\
          比如：
          \begin{quote}
            你的 .tex 文件中有这么一行：

            \begin{quote}
              \fbox{
                \parbox{80mm}{
                  \centering
                  $\backslash$ begin\{CJK\}\{UTF8\}\{gbsn\}
                }
              }
            \end{quote}

            那 latex 就找到 /usr/share/texmf/tex/latex/CJK/UTF8/c70gbsn.fd，然后根据这个文件中的 $\backslash$DeclareFontShape\{C70\}\{gbsn\}\{m\}\{n\}\{$<->$ CJK $*$ FZSongTi-$-$uni\}\{\} 行在\$HOME/texmf/fonts/tfm/cjk-latex/Unicode/FZSongTi-uni/中找到需要的 .tfm 文件。
          \end{quote}
        \item 根据 .map 文件得到 .tfm 文件对应的 .pfb 文件，得到需要的字型。
      \end{enumerate}
\end{enumerate}
\section{几个挺有用的网站}
\begin{enumerate}
  \item http://dragon7557.itpub.net/post/3579/294429
  \item http://blog.jjgod.org/2005/08/30/about-tex-fonts/
  \item http://mailboxpublic.googlepages.com/texlive2007cjkchinesehowto
\end{enumerate}
\end{CJK}
\end{document}
